# 数据类型转换
a = int("123")
print(a + 10)
# 函数名赋给一个变量，该变量就可以是该函数操作(函数别名)
b = max
c = b(1, 2, 3, 4)
print(c)


# 自定义函数 def语句
def my_abs(x):
    # isinstance 检查参数类型
    if not isinstance(x, (int, float)):
        # raise python的抛出异常
        raise TypeError('输入参数类型错误')
    if x < 0:
        return -x
    else:
        return x


m = my_abs(12)
print(m)


# 空函数（可能现在暂时不知道这个函数的具体实现逻辑）
def nop():
    pass


# 返回多个值（其实就是返回一个元组），return用逗号隔开
def register(num, city):
    return 'No.' + num, city


# 获取多个返回值
n, c = register('001', 'gz')
print(n)
print(c)


# 函数的参数
# 位置参数，调用函数时，传入的值按照定义顺序传入
# 自定义一个函数，计算参数的平方
def power(x, time=2, a=3):
    s = 1
    while time > 0:
        s = s * x
        time = time - 1
    return s


p = power(3, 4)
print(p)

# 默认参数（尽量使用不变对象）
# 必选参数在前（没设定默认值的），默认参数在后，同C++
p1 = power(5)
print(p1)
# 可以采用以下方式跳过中间的默认参数
# 这时，4就不会赋给time了
p2 = power(5, a=4)
print(p2)


# 可变参数（传入参数个数可变）
# 在变量前面加一个*，那么，number就当做是tuple传入（类似于链表）
def calc2(*number):
    sum = 0
    for n in number:
        sum = sum + n * n
    return sum


c = calc2(3, 5, 6, 9)
print(c)


# 关键字参数(两个*)
# 关键字参数就是传入一个字典
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)


person("zhangsan", '18')
person("zhangsan", '18', sex='男', city='gz')


# 命名关键字参数（不可以为空，但是可以设置默认值）
# 限制输入的关键字只能有city和job两个，（位置可以变）
def person2(name, age, *, city, job):
    print(name + age)


person2('hello', '18', city='gz', job='da')
